/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Parser.Manejador;

import DOM.Estructura.Atributo;
import DOM.Estructura.Elemento;
import DOM.*;
import Excepciones.ParserException;
import Utilidades.AtributoEtiqueta;

/**
 * Manejador DOM se encarga de crear la representación del documento en memoria
 * @author Administrador
 */
public class ManejadorDOM implements IManejadorContenido{

        private DomXML doc;

    /**
     * Devuelve la instancia de la clase ManejadorDOM que contiene el arbol del XML
     * @return el objeto DomXML que se utiliza para parsear el XML
     */
    public DomXML getDocumento() {
        return doc;
    }

    /**
     * Crea una nueva instancia de DomXML para manejar el archivo XML
     * @throws ParserException
     */
    public void inicioDocumento() throws ParserException {
        doc = new DomXML();
    }

    public void finDocumento() throws ParserException {
        doc.setFinDeElemento();
    }

    /**
     * Agrega la etiqueta con todos sus atributos a la estructura de memoria
     * @param nombreEtiqueta nombre de la etiqueta XML
     * @param variables lista de atributos de la etiqueta
     * @throws ParserException
     */
    public void etiquetaApertura(String nombreEtiqueta, AtributoEtiqueta[] variables) throws ParserException {
        Elemento e = new Elemento(nombreEtiqueta);
        Atributo a;

        if(variables.length > 0){
            for(int i = 0; i< variables.length; i++){

                a = new Atributo(variables[i].getNombre(), variables[i].getValor(), 0);
                e.agregarAtributo(a);
            }
        }
        doc.agregarElementoAlDocumento( e );
    }

    /**
     * Indica el cierre de una etiqueta de apertura
     * @param nombreEtiqueta nombre de la etiqueta
     * @param etiquetaLeida texto completo de la etiqueta
     * @throws ParserException
     */
    public void etiquetaCierre(String nombreEtiqueta, String etiquetaLeida) throws ParserException {
        doc.setFinDeElemento();
    }

    /**
     * Agrega el contenido entre las etiquetas a la estructura
     * @param contenido Cadena que representa el texto a agregar
     * @throws ParserException
     */
    public void agregarContenido(String contenido, int tipoContenido) throws ParserException {
        doc.setContenido(contenido, tipoContenido);
    }

    /**
     * Se encarga de agregar los atributos del prologo del archivo a la representaciòn en memoria.
     * @param variables atributos del prologo del archivo XML
     * @throws ParserException
     */
    public void prologoXML(AtributoEtiqueta[] variables) throws ParserException {

        for (int i = 0; i < variables.length; i++) {
            AtributoEtiqueta atributo = variables[i];
            doc.getEncabezado().agregar( new Atributo(atributo) );
        }
    }
}
